package com.nf.teamwork.mall.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;

/**
 * @Author: LJP
 * @Classname UserInf
 * @Date: 2020-02-27 08:09
 * @Description: 用户表实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("用户表实体类(UserInf)")
public class UserInf implements UserDetails {
    @ApiModelProperty("用户表ID(userInfId)")
    /*用户表ID*/
    private Integer userInfId;
    @ApiModelProperty("用户姓名(userInfName)")
    /*用户姓名*/
    private String userInfName;
    @ApiModelProperty("用户性别(userInfGender)：0:\"男\",1:\"女\"")
    /*用户性别(0:"男",1:"女")*/
    private Byte userInfGender;
    @ApiModelProperty("用户身份证号(userInfCard)")
    /*用户身份证号*/
    private String userInfCard;
    @ApiModelProperty("用户手机号(userInfPhone)")
    /*用户手机号*/
    private String userInfPhone;
    @ApiModelProperty("用户邮箱(userInfEmail)")
    /*用户邮箱*/
    private String userInfEmail;
    @ApiModelProperty("头像(headPicture)")
    /*头像*/
    private String headPicture;
    @ApiModelProperty("昵称(userInfNickname)")
    /*昵称*/
    private String userInfNickname;
    @ApiModelProperty("登录账号(username)")
    /*
        登录账号,
        这里将原先userInfAccount字段改成了username,
        是因为在做SpringSecurity安全框架认证时
        框架中是以username字段存放用户名，如果我们想达到的目的是将我们数据库中的账号作为登录的用户名
        那么这里就需要将字段名与框架提供的改成一样的了，不然后面会造成找不到相应数据的错误（待研究，不是很确定）
    */
    private String username;
    @ApiModelProperty("登录密码(password)")
    /*登录密码*/
    private String password;
    @ApiModelProperty("邮箱激活码(emailCode)")
    /*邮箱激活码*/
    private String emailCode;
    @ApiModelProperty("激活状态(activateStatus)：0:\"未激活\",1:\"激活\"")
    /*激活状态(0:"未激活",1:"激活")*/
    private Integer activateStatus;

/*===========================================扩展字段开始===========================================*/

    @ApiModelProperty("用户角色列表对象(roles)")
    /*用户角色列表对象*/
    private List<RoleInf> roles;

/*===========================================扩展字段结束===========================================*/

    @JsonIgnore
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return roles;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    /**
     * 以下四个实现方法都是用来判断当前用户是否可用
     */

    @JsonIgnore
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @JsonIgnore
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @JsonIgnore
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @JsonIgnore
    @Override
    public boolean isEnabled() {
        //表示用户已激活，只有激活用户才可登录
        return activateStatus == 1;
    }
}
